package cluedo.gui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import static cluedo.Player.log;


public class Help extends JDialog implements ActionListener,ListSelectionListener{
	
	private static final long serialVersionUID = 3373585083757718669L;

	/**
	 * Il CardLayout che gestisce il cambio pagina
	 */
	private CardLayout c;
	
	/**
	 * il JPanel con il layout CardLayout
	 */
	private JPanel pages;
	
	/**
	 * mantiene l'indice dell'ultima pagina visualizzata
	 */
	private int lastNum=0;
	
	
	/**
	 * la lista degli argomenti trattati nelle istruzioni
	 */
	private JList<String> indexList;
	
	
	/**
	 * MainWindow di Cluedo
	 */
	private MainWindow wind;
	
	/**
	 * Crea la finestra delle istruzioni di gioco
	 * @param frame il JFrame della Mainwindow che contiene il tasto aiuto
	 * @param wind la MainWindow che contiene il tasto aiuto
	 */
	public Help(JFrame frame, MainWindow wind){
		
		super(frame);
		
		this.wind=wind;
		
		addWindowListener(wind);
	       		
		log.println("Help: creazione finestra di aiuto");
        createAndShow(frame);
		
	}
	
	
	/**
	 * @param frame il JFrame della Mainwindow che contiene il tasto aiuto
	 */
	private void createAndShow(JFrame frame){
		
		setModal(false); 
		setBackground(Color.DARK_GRAY);
		setTitle("Appunti del detective");
		
		
		JPanel wrapContainer= new JPanel();
		
		wrapContainer.setBackground(this.getBackground());

		
		wrapContainer.setLayout(new BorderLayout());
		
		
		
		String[] arg = {"  Appunti  ", "  Il gioco  ", "  Indagine  ", "  Accusa  ","  Suggerimenti  ","  Informazioni  "};
		
		Cursor handCurs = new Cursor(Cursor.HAND_CURSOR);

		
		indexList = new JList<String>(arg);
		indexList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		indexList.setFont(new Font("Arial",Font.BOLD,16));
		indexList.setBackground(this.getBackground());
		indexList.setCursor(handCurs);
		indexList.setForeground(Color.WHITE);
		indexList.setFixedCellHeight(50);
		indexList.addListSelectionListener(this);
		indexList.setSelectedIndex(0);
		
		indexList.setCellRenderer(new DefaultListCellRenderer(){
	
			private static final long serialVersionUID = -4313163163027337078L;

			public int getHorizontalAlignment() {
	                return CENTER;
	       }
		});
		
		c = new CardLayout();
		
		pages = new JPanel(c);
		
		pages.setBackground(this.getBackground());
		
		pages.add(addFirstPage(),"PAGINA1");
		pages.add(addSecondPage(),"PAGINA2");
		pages.add(addThirdPage(),"PAGINA3");
		pages.add(addFourthPage(),"PAGINA4");
		pages.add(addFifthPage(),"PAGINA5");
		pages.add(addSixthPage(),"PAGINA6");
		
		
		JPanel btnPane = new JPanel();
		
		btnPane.setBackground(this.getBackground());
		
		
		btnPane.setLayout(new BoxLayout(btnPane,BoxLayout.X_AXIS));
		
		

		
		Image nextImg = new ImageIcon(Help.class.getResource("/img/next.png")).getImage();
		ImageIcon nextIcon= new ImageIcon(nextImg.getScaledInstance(-1, 30, Image.SCALE_SMOOTH));
		JButton next =new JButton();
		next.setIcon(nextIcon);
		next.addActionListener(this);
		next.setContentAreaFilled(false);
		next.setBorderPainted(false);
		next.setBorder(null);
		next.setToolTipText("Next");
		next.setActionCommand("Next");
		next.setCursor(handCurs);

		
		Image prevImg = new ImageIcon(Help.class.getResource("/img/prev.png")).getImage();
		ImageIcon prevIcon= new ImageIcon(prevImg.getScaledInstance(-1, 30, Image.SCALE_SMOOTH));
		JButton prev =new JButton();
		prev.setIcon(prevIcon);
		prev.addActionListener(this);
		prev.setBorder(null);
		prev.setContentAreaFilled(false);
		prev.setBorderPainted(false);
		prev.setActionCommand("Prev");
		prev.setToolTipText("Previous");
		prev.setCursor(handCurs);

		
		Image closeImg = new ImageIcon(Help.class.getResource("/img/close.png")).getImage();
		ImageIcon closeIcon= new ImageIcon(closeImg.getScaledInstance(-1, 30, Image.SCALE_SMOOTH));
		JButton close =new JButton();
		close.setIcon(closeIcon);
		close.addActionListener(wind);
		close.setContentAreaFilled(false);
		close.setBorderPainted(false);
		close.setBorder(null);
		close.setActionCommand("Close");
		close.setToolTipText("Close");
		close.setCursor(handCurs);
		close.setAlignmentX(CENTER_ALIGNMENT);
	
		
		btnPane.add(Box.createRigidArea(new Dimension(10,0)));	
		btnPane.add(prev);
		btnPane.add(Box.createRigidArea(new Dimension(15,0)));
		btnPane.add(next);
		btnPane.add(Box.createRigidArea(new Dimension(10,0)));
		
		
		JPanel centerPane= new JPanel();
		
		centerPane.setBackground(this.getBackground());
		
		centerPane.setLayout(new BoxLayout(centerPane,BoxLayout.Y_AXIS));
		
		centerPane.add(pages);
		
		
		JPanel leftPane= new JPanel();
		
		leftPane.setBackground(this.getBackground());

		
		leftPane.setLayout(new BoxLayout(leftPane,BoxLayout.Y_AXIS));
		
		leftPane.add(Box.createRigidArea(new Dimension(0,10)));
		leftPane.add(close);
		leftPane.add(Box.createRigidArea(new Dimension(0,35)));
		leftPane.add(indexList);
		leftPane.add(Box.createVerticalGlue());	
		leftPane.add(btnPane);
		leftPane.add(Box.createRigidArea(new Dimension(0,50)));	
		

		
		JPanel rightPane= new JPanel();
		
		rightPane.setBackground(this.getBackground());
		
		JPanel upPane= new JPanel();
		
		upPane.setBackground(this.getBackground());
		
		JPanel downPane= new JPanel();
		
		downPane.setBackground(this.getBackground());
		
		wrapContainer.add(leftPane,BorderLayout.LINE_START);
		wrapContainer.add(centerPane,BorderLayout.CENTER);
		wrapContainer.add(rightPane,BorderLayout.LINE_END);
		wrapContainer.add(upPane,BorderLayout.PAGE_START);
		wrapContainer.add(downPane,BorderLayout.PAGE_END);
		
		
		add(wrapContainer);
		
		pack();
		setLocationRelativeTo(frame);
		setVisible(true);
		
		log.println("Help: la finestra di aiuto e' stata creata");

		
	}
	
	
	/**
	 * Crea e restituisce la prima pagina
	 * @return vedi descrizione
	 */
	private PageHelp addFirstPage(){
		
		PageHelp page = new PageHelp();
		
		JTextPane textPage= new JTextPane();
		
		
		
		String text="Il dottor Black e' stato trovato morto\n" +
					"sabato sera alle ore 20.45 circa.\n\n" +
				    "Il corpo e' stato ritrovato ai piedi delle scale\n" +
				    "che portano alle cantine della villa.\n\n" +
				    "Miss Scarlett ha trovato il cadavere. Le sue urla\n" +
				    "si sono sentite fino nei villaggi dei dintorni...\n" +
				    "non e' una reazione un po' sospetta?\n\n" +
				    "La causa della morte non e' stata ancora precisata,\n" +
				    "ma ci sono diversi oggetti nella villa che potrebbero\n" +
				    "essere stati utilizzati per l'assassinio:\n\n" +
				    "Pugnale, Candeliere, Rivoltella\n" +
				    "Fune, Spranga, Chiave inglese\n\n" +
				    "I principali sospettati sono gli ospiti invitati\n" +
				    "alla villa per il week-end. Sono:\n\n" +
				    "Colonnello Mustard, Professor Plum, Reverendo Green\n" +
				    "Mrs Peacock, Miss Scarlett, Mrs White\n";
		
		createPage(textPage,"\nAppunti del detective\n\n",text);
		
		
		page.add(textPage);
		return page;
		
	}
	
	
	/**
	 * Crea e restituisce la seconda pagina
	 * @return vedi descrizione
	 */
	private PageHelp addSecondPage(){
		
		PageHelp page = new PageHelp();
		
		JTextPane textPage= new JTextPane();
				
		String text="La soluzione del delitto e' rappresentata da 3 carte:\n" +
				"una raffigurante le stanze,una i personaggi, una le armi.\n\n" +
				"Per risolvere il mistero dovete scoprire:\n" +
				"Chi e' l'assassino;\n" +
				"Quale arma e' stata usata;\n" +
				"In quale stanza e' stato commesso il delitto.\n\n" +
				"Potete immediatamente eliminare i personaggi, le armi\n" +
				"e le stanze che sono raffigurati sulle carte in vostro\n" +
				"possesso, in quanto non saranno qulli coinvolti nel\n" +
				"delitto.\n\nDurante il gioco per fare le vostre indagini\n" +
				"dovete spostarvi nelle diverse stanze della villa.\n" +
				"Una volta entrati in una stanza, al vostro turno,\n" +
				"avanzate un'ipotesi chiamando in causa un personaggio\n" +
				"ed un'arma che secondo voi potrebbero essere implicati\n" +
				"nel delitto.\n\nSe la vostra ipotesi non e' corretta verra'\n" +
				"confutata da un altro giocatore che vi mostrera' la\n" +
				"carta in suo possesso che confuta la vostra ipotesi.\n\n" +
				"Quando siete sicuri di aver trovato la possibile soluzione\n" +
				"avanzate la vostra accusa (soluzione).";
		
		createPage(textPage,"\nCome risolvere il mistero\n\n",text);	
	     
		page.add(textPage);
		return page;
		
	}

	/**
	 * Crea e restituisce la terza pagina
	 * @return vedi descrizione
	 */
	private PageHelp addThirdPage(){
		
		JTextPane textPage= new JTextPane();
				
		String text="Al vostro turno, lanciate il dado e muovete la pedina\n" +
					"di un numero di caselle corrispondente al numero\n" +
					"ottenuto con il lancio del dado\n\n" +
					"Quando entrate in una delle stanze della villa,\n" +
					"potete subito avanzare un'ipotesi.\n" +
					"Nota: la pedina di un giocatore puo' rimanere nella\n" +
					"stessa stanza per piu' turni, se cio' puo' servire\n" +
					"ad eliminare la stanza dai sospetti\n\n" +
					"Se il giocatore che ha il turno prima di voi\n" +
					"ha avanzato un'ipotesi e voi avete almeno una delle\n" +
					"carte che ha nominato, dovete mostrargliene una a\n" +
					"vostra scelta.\n\n" +
					"Se non avete nessuna delle carte\n" +
					"nominate nell'ipotesi tocchera' al giocatore\n" +
					"successivo mostrare una delle carte nominate\n" +
					"eventualmente in suo possesso.\n\n" +
					"Ad un certo punto del gioco, in modo particolare\n" +
					"verso la fine, puo' accadere che nessun giocatore\n" +
					"sia in possesso delle carte nominate.\n";
		
		PageHelp page = new PageHelp();
		
		createPage(textPage,"\nCome dei veri detective\n\n",text);
		
		page.add(textPage);
		return page;
	
	}

	/**
	 * Crea e restituisce la quarta pagina
	 * @return vedi descrizione
	 */
	private PageHelp addFourthPage(){
	
		PageHelp page = new PageHelp();
		
		JTextPane textPage= new JTextPane();		
		
		String text="Continuate a muovere la vostra pedina sul tabellone,\n" +
					"facendo ipotesi quando entrate\n" +
					"nelle diverse stanze, finche' non credete di saper\n" +
					"rispondere a queste 3 domande:\n\n" +
					"Chi e' l'assassino?\n" +
					"Quale arma e' stata usata?\n" +
					"In quale stanza e' stato commesso il crimine?\n\n" +
					"A questo punto potete formulare un'accusa\n" +
					"(o soluzione).\n" +
					"Dovete essere certi del risultato della vostra\n" +
					"indagine, perche' potete fare una sola accusa\n" +
					"durante il gioco\n\n" +
					"Se la vostra accusa e' corretta avete risolto il\n" +
					"mistero e vinto la partita\n\n" +
					"Se la vostra accusa e' sbagliata, sarete eliminati.\n";
		
		createPage(textPage,"\nMovente, Mezzo, Opportunita'\n\n",text);

		
		page.add(textPage);
		
		return page;
	
	}
	
	
	/**
	 * Crea e restituisce la quarta pagina
	 * @return vedi descrizione
	 */
	private PageHelp addFifthPage(){
	
		PageHelp page = new PageHelp();
		
		JTextPane textPage= new JTextPane();		
		
		String text="Prima di avanzare un'ipotesi, dovete aver ben chiaro\n" +
					"che tipo di informazioni volete ottenere.\n\n" +
					"State cercando di trovare il colpevole o pensate di\n" +
					"trovare l'arma o la stanza del delitto?\n\n" +
					"Se state cercando degli indizi generici, e' meglio\n" +
					"che indichiate nelle vostre ipotesi personaggi,\n" +
					"armi e stanze che non sono in vostro possesso!\n\n\n" +
					"Se, al contrario, state cercando di trovare il\n" +
					"colpevole, potreste utilizzare per la vostra\n" +
					"ipotesi un'arma e una stanza di cui gia'\n" +
					"possedete le carte: in questo modo, se nessuno\n" +
					"vi confutera' la carta del personaggio da voi\n" +
					"nominato, siete sicuri che e' lui l'assassino.\n\n" +
					"Se invece la carta del personaggio da voi\n" +
					"nominato e' in possesso di qualche giocatore,\n" +
					"verra' eliminato dalla vostra lista di possibili\n" +
					"sospettati";
		
		createPage(textPage,"\nCome fare le deduzioni corrette\n\n",text);

		
		page.add(textPage);
		
		return page;
	
	}
	
	
	/**
	 * Crea e restituisce la quarta pagina
	 * @return vedi descrizione
	 */
	private PageHelp addSixthPage(){
	
		PageHelp page = new PageHelp();
		
		JTextPane textPage= new JTextPane();		
		
		String text="Le pedine possono entrare nelle diverse stanze solo\n" +
					"dalle porte.\n\n" +
					"I passaggi segreti sono dal salotto alla veranda e\n" +
					"dalla cucina allo studio\n" +
					"Se siete entrati in una di queste stanze, al turno\n" +
					"successivo, potete passare attraverso i passaggi\n" +
					" segreti\n\n" +
					"Le pedine non possono muoversi in diagonale,\n" +
					"Due pedine non possono occupare una stessa casella\n" +
					"e per muovervi non potete attraversare una casella\n" +
					"che e' occupata.\n\n" +
					"In una stessa stanza possono trovarsi\n" +
					"contemporaneamente piu' pedine.\n\n" +
					"Potete anche bluffare, coinvolgendo nelle vostre\n" +
					"ipotesi carte che sono in vostro possesso in modo\n" +
					"da confondere gli altri giocatori.\n\n";
		
		createPage(textPage,"\nInformazioni Utili\n\n",text);

		
		page.add(textPage);
		
		return page;
	
	}

	
	/**
	 * Scrive il testo nella pagina
	 * @param doc lo StyledDocument associato 
	 * @param title il titolo della pagina
	 * @param text il testo nella pagina
	 */
	private void createPage(JTextPane textPage, String title,String text){
		
		StyledDocument doc = textPage.getStyledDocument();
		textPage.setOpaque(false);
		textPage.setEditable(false);
		
        SimpleAttributeSet titleStyle = new SimpleAttributeSet();
        SimpleAttributeSet textStyle = new SimpleAttributeSet();
               
		 StyleConstants.setForeground(titleStyle ,Color.YELLOW);
	     StyleConstants.setFontFamily(titleStyle ,"Helvetica");
	     StyleConstants.setFontSize(titleStyle , 18);
	     StyleConstants.setBold(titleStyle,true);
	     
	     
	     StyleConstants.setFontFamily(textStyle ,"Helvetica");
	     StyleConstants.setForeground(textStyle ,Color.WHITE);
	     StyleConstants.setFontSize(textStyle , 14);
	     StyleConstants.setBold(textStyle,true);
	     
	     try {
	    	doc.insertString(doc.getLength(),title,titleStyle);
			doc.insertString(doc.getLength(),text,textStyle);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	     
	     
	     SimpleAttributeSet center = new SimpleAttributeSet();
	     StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
	     doc.setParagraphAttributes(0, doc.getLength(), center, false);

		
	}
	


	/**
	 * Classe che rappresenta una pagina del manuale di istruzioni
	 *
	 */
	private class PageHelp extends JPanel implements ComponentListener{
		

		private static final long serialVersionUID = -3865488152959527584L;
		
		/**
		 * L'immagine di background
		 */
		private ImageIcon bgImg;
		
		public PageHelp(){
			
			super();
			scaleBg(400,-1);
			setBackground(Color.BLACK);
			this.setPreferredSize(new Dimension(bgImg.getIconWidth(),bgImg.getIconHeight()));
			this.setMinimumSize(new Dimension(bgImg.getIconWidth(),bgImg.getIconHeight()));
			this.addComponentListener(this); 
			
		}
		
	    
	    /**
	     * Restituisce l'altezza dell'immagine di backgroung
	     * @return vedi descrizione
	     */
	    private int getBgHeight(){
	    	
	    	return bgImg.getIconHeight();
	    }
	    
	    
	    /**
	     * Restituisce la larghezza dell'immagine di backgroung
	     * @return vedi descrizione
	     */
	    private int getBgWidth(){
	    	return bgImg.getIconWidth();
	    }
	    
	    /**
	     * Scala il background
	     * @param width la nuova larghezza
	     * @param height la nuova altezza
	     */
	    private void scaleBg(int width,int height){
	    	
	    	Image tmpImg= new ImageIcon(BoardPanel.class.getResource("/img/blood.jpg")).getImage();
		    this.bgImg = new ImageIcon(
	        		tmpImg.getScaledInstance(width, height, Image.SCALE_SMOOTH)
	        		);
	    	this.repaint();
	    }
	    
	    @Override
	    protected void paintComponent(Graphics g)
		{
	    	
	    	super.paintComponent(g);
	    	
	    	g.drawImage(bgImg.getImage(), 0, 0,null); 
	    	
	    	
		}



		@Override
		public void componentResized(ComponentEvent e) {
			scaleBg(e.getComponent().getWidth(),e.getComponent().getHeight());
		}




		@Override
		public void componentMoved(ComponentEvent e) {
			
		}




		@Override
		public void componentShown(ComponentEvent e) {
			
		}




		@Override
		public void componentHidden(ComponentEvent e) {
			
		}
				
		
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		String action = e.getActionCommand();
		
		if(action.equals("Next")){
			if(indexList.getSelectedIndex()==5){
				return;
			}
			c.next(pages);
			indexList.setSelectedIndex(++lastNum);
		}
				
		else if(action.equals("Prev")){
			
			if(indexList.getSelectedIndex()==0){
				return;
			}
			c.previous(pages);
			indexList.setSelectedIndex(--lastNum);
			
		}
		
	}


	@Override
	public void valueChanged(ListSelectionEvent e) {
		if (e.getValueIsAdjusting() == false){
			@SuppressWarnings("unchecked")
			JList<String> list = (JList<String>)e.getSource();
			int num=list.getSelectedIndex();
			if(num!=-1 && c!=null) {
				
				if(num==0){
					c.show(pages,"PAGINA1");
					lastNum=0;
				}
				
				else if(num==1){
					c.show(pages,"PAGINA2");
					lastNum=1;
				}
				else if(num==2){
					c.show(pages,"PAGINA3");
					lastNum=2;
				}
				else if(num==3){
					c.show(pages,"PAGINA4");
					lastNum=3;
				}
				else if(num==4){
					c.show(pages,"PAGINA5");
					lastNum=4;
				}
				else if(num==5){
					c.show(pages,"PAGINA6");
					lastNum=5;
				}
				
			}
	
		}
	}

	

}
